Curso R, Segunda parte

Noé Osorio García

2020-08-13


Clase 6

Analiza - Presenta - Comparte

Los datos cuentan historias, las investigaciones deben ser compartidas, las visualizaciones análizadas, los resultados de las hipótesis planteadas pueden evaluarse, algunas veces son auditadas y otras veces los cálculos deben ser reproducibles por temas de transparencia o por evaluación. Un ejemplo de compartir o revisar el cálculo de algunos indicadores podría ser el reporte de la Enigh2018_indicadores_R en el que presenta su código del cálculo de los principales indicadores en R.

Una cosa es compartir los resultados y otra cosa compartir el código..pero en un archivo Rmarkdown se podría compartir ambos tanto en formato R para que sea evaluado, auditado y revisar el código etc.. como en formato html donde únicamente presentas los resultados. Hay que tener en cuenta que un archivo Rmarkdown genera un archivo html por lo tanto es independiente a R o sea que al compartirlo la persona no requiere tener R instalado.

Antes de iniciar con archivos rmarkdown te sugiero que revises la cheatsheet donde te servirá de guía para darle formato al texto o a la presentación. Para el formato mostrado se usará una plantilla de la librería "prettydoc" así que si no la tienes puedes instalarla en un script de R con el comando install.packages("prettydoc",dependencies=T)

Para abrir un archivo en rmarkdown debes hacer lo siguiente ..

Al darle clic en la opción rmarkdown te dirige a a esta ventana, Si usas la paquetería base en esa ventana pon tu nombre y título de investigación presentación etc

En este ejericio debes ir a from Template usa (opcional) la plantilla prettydoc en document

Y te va a agenerar una platilla similar a la siguiente captura, con ejemplos de script, títulos, notas de página y varios tips... pero borra todo MENOS la parte del cuadro rojo .

En la captura del cuadro rojo muestra los siguientes elementos:

  • title: "pon el título que quieras"
  • author: "tu nombre"
  • date: r sys.Date() #es una función de R, pone el día en automático, puedes editarla o dejarla así.
  • output: #Resultado de tu archivo, o sea indica que generará un html_pretty con el theme o plantilla de hpstr puedes usar cayman leonids etc..

Importante

Antes de empezar a redactar hay algo que debemos hacer .. al escribir en un software que usan miles de personas al rededor del mundo .. debemos de buscar la codificación de carácteres en la que podemos redactar sin problemas y guardarlo con esa codificación. Si preguntas qué pasa si no hago este paso, la respuesta es que podría sustituir algunas tildes/acentos o sea en lugar de que se vea ¿Cuál es la diferencia? el resultado al guardarlo y retomar para seguir escribiendo sería ¿cu/a~/l es la diferencia? no al ejecutarlo pero sí al querer continuar con el archivo así que mejor haz el encoding desde el principio.

Encoding.

La ruta para guardarlo con la codificación de carácteres es la siguiente:

y una vez ahí selecciona:

Ahora sí ya puedes escribir, poner acentos y listo

Introducción al formato:

A diferencia de usar símbolos de gatos para poner texto como en los scripts de R aquí es diferente ya que TODO el archivo es un formato de texto y donde deseas integrar operaciones u objetos de código ya sea de R, python, SQL debes indicar por medio de pedazos dentro del archivo de texto.

  • +¿Tú que haces?
  • -Yo soy una función que inserta un pedazo dentro del texto que permite usar las funciones del software
  • +ah...te llamaré chunk

Entonces el código se verá así cuando no tengamos ningún código de R, ni python ni SQL.. úncamente texto y algunas comillas asteríscos y símbolos de gatos ayudan a darle el formato.. si quieres practicar usa la hoja de referencia :) cheatsheet

O sea hasta ahora es puro texto, pero recuerda que un rmarkdown es un archivo INDEPENDIENTE DE R así que aúnque ya tengas cargados en tu enviroment tus bases de datos librerías etc es necesario cargarlas en tu archivo de R y para eso nos apoyamos en un chunk .. para ínsertar uno la función de teclado es contrl+alt+i = chunk y ahí ya puedes iniciar con código de R

En la captura anterior cargo las librerías .. y me sale un error .. porque la librería no existe o no está instalada ... por lo tanto el chunk completo ya no se ejectura y al querer hacer la transformación a un html indicará un error (si requieres instalar alguna, puedes instalarla en el chunk y luego borrar el comando "instal.packages" ya después solo llama la librería

#Aquí ya usé código de R y es como si escribiera en la consola, 
#puedo cargar librerías y llamar a bases de datos.
library(tidyverse)
## -- Attaching packages --------------------------------------------------------------------------------- tidyverse 1.3.0 --
## v ggplot2 3.3.2     v purrr   0.3.4
## v tibble  3.0.3     v dplyr   1.0.1
## v tidyr   1.1.1     v stringr 1.4.0
## v readr   1.3.1     v forcats 0.5.0
## -- Conflicts ------------------------------------------------------------------------------------ tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag()    masks stats::lag()
library(plotly)
## 
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
## 
##     last_plot
## The following object is masked from 'package:stats':
## 
##     filter
## The following object is masked from 'package:graphics':
## 
##     layout
library(foreign)
library(readxl)
catalogo <- read_excel("ENTIDAD_FEDERATIVA_201602.xlsx")
enigh <- read.dbf("enigh2018_ns_concentradohogar_dbf/concentradohogar.dbf")

Una vez cargadas las bases dentro de un chunk puedes ejecutar línea por línea o en la esquina superior izquierda hay un triángulo verde y si le das clic se ejecuta todo el chunk, si hay algún error lo mostrará en rojo, pero lo que hace R es que ejecuta el código y muestra el código, los warning y algunos mensajes.. si quieres omitir podemos hacerlo por partes. dentro de las opciones del chunk so debes poner la siguiente función en el chunk: {r echo=FALSE, message=FALSE, warning=FALSE}

  • echo= FALSE únicamente muestra los resultados
  • message= FALSE oculta los mensajes que pueden indicar como versión de la librería
  • warning= FALSE oculta los warnings

Formatos para Redactar

La siguiente lista te puede dar una referencia rápida para integrar títulos, subtitulos, negritas, ecuaciones etc.

Título 1

  • Título 1 = # título 1

Título 2

  • Título 2 = ## título 2

Título 3

  • Título 3 = ### título 3

Título 4

  • Título 4 = #### título 4
Título 5
  • Título 5 = ##### título 5

la ventaja del rmarkdown es que puedes integrar ecuaciones ya sea para mostrar la ecuación del modelo de tu investigación \[Y=\beta_0 +\beta_1x_1+\beta_2x_2+u\] o solo como referencias Probabilidad binomial está definida como ..\[f(y|N,p) = \frac{N!}{y!(N-y)!}\cdot p^y \cdot (1-p)^{N-y} = {{N}\choose{y}} \cdot p^y \cdot (1-p)^{N-y}\] Si sabes latex podría facilitarte mucho pero para las personas que se nos complica usamos siempre ya se aun libro como apoyo u hojas de referencia :) .. en este libro de Rmarkdown en el capítulo 2.5.3 math expresions puedes investigar más sobre expresiones mátemáticas en latex aplicado a Rmarkdown pero si no vas a usar ecuaciones basta con la hoja de referencia y las opciones del chunk para darle formato al archivo final.. pero bueno una referencia rápida al introducir ecuaciones es "$$Y=\beta_0 +\beta_1x_1+\beta_2x_2+u$$" o sea el símbolo de $$aquí va la expresión$$, para subindices usa guión bajo, para exponente usa ^2, y para las letras .. alpha, beta, separados por el caracter \ en mi computadora ese caracter se pone con altGr + símbolo de interrogación ? o sea altGr +? = \

Practica este formato con las clases anteriores, carga las bases de datos dentro del rmarkdown introduce las visualizaciones, introduce visualizaciones dinámicas, intenta escribir una ecuación y ya apartir de aquí usaremos rmarkdown para poder compartir :)

Ejercicios de clase aplicados al rmarkdown

JOINS

uniones de bases de datos, las uniones nos sirven mucho al querer relacionar las bases de datos con otra, complementarla o encontrar diferencias respecto a una con otra. hay ciertas características que deben seguir los join.

  • Tener una variable en común en las bases al hacer el join
  • La variable en común debe de ser del mismo tipo.
  • la variable debe tener el mismo nombre.

Aquí una imagen en la cuál puedes apoyar para saber los joins más comúnes y como se forman.

En el caso de la enigh para unir con la claveEntidad de otro archivo se Crea la variable estado a partir de la etracción de los primeros dígitos de la variable "ubica_geo"

enigh <- enigh %>% 
  mutate(Estado=substring(ubica_geo,1,2),
         sexo=ifelse(sexo_jefe==1,"Hombre","Mujer"))

Identificar la clase al que son ambas variables con el comando "class"

class(enigh$Estado)
## [1] "character"
class(catalogo$CATALOG_KEY)
## [1] "character"

Si ambos son del mismo tipo ##¿Ya puedo unirlas?

No, ya se cumplió la primera regla pero ahora debemos cambiar el nombre. con el comando rename

catalogo <- catalogo %>% rename(Estado=CATALOG_KEY)
colnames(catalogo)
## [1] "Estado"             "ENTIDAD_FEDERATIVA" "ABREVIATURA"
  • INNER JOIN
  • LEFT JOIN
  • FULL JOIN
  • ANTI JOIN
  • RIGH JOIN

En la hoja de referencia data wranglig encontrarás un poco más de información sobre los join y diferencias de cada uno.

antijoin

Obervaciones que no están en común, la enigh cuenta con los estados desde 01 hasta el 32 por lo tanto no tiene estas tres observaciones .. y al hacer el antijoin indica las observaciones que no tiene en común el catálogo con la ENIGH

anti_join(catalogo,enigh,by="Estado")
## # A tibble: 3 x 3
##   Estado ENTIDAD_FEDERATIVA ABREVIATURA
##   <chr>  <chr>              <chr>      
## 1 00     NO ESPECIFICADO    NE         
## 2 88     NO APLICA          NA         
## 3 99     SE IGNORA          SI

Si lo ejecutas al revés indica que tiene una base con 0 rows o sea 0 registros, ya que la enigh en la variable Estado (por la que se unió) no existe el Estado "00", "88" ni "99"

anti_join(enigh,catalogo,by="Estado")
##   [1] folioviv   foliohog   ubica_geo  tam_loc    est_socio  est_dis   
##   [7] upm        factor     clase_hog  sexo_jefe  edad_jefe  educa_jefe
##  [13] tot_integ  hombres    mujeres    mayores    menores    p12_64    
##  [19] p65mas     ocupados   percep_ing perc_ocupa ing_cor    ingtrab   
##  [25] trabajo    sueldos    horas_extr comisiones aguinaldo  indemtrab 
##  [31] otra_rem   remu_espec negocio    noagrop    industria  comercio  
##  [37] servicios  agrope     agricolas  pecuarios  reproducc  pesca     
##  [43] otros_trab rentas     utilidad   arrenda    transfer   jubilacion
##  [49] becas      donativos  remesas    bene_gob   transf_hog trans_inst
##  [55] estim_alqu otros_ing  gasto_mon  alimentos  ali_dentro cereales  
##  [61] carnes     pescado    leche      huevo      aceites    tuberculo 
##  [67] verduras   frutas     azucar     cafe       especias   otros_alim
##  [73] bebidas    ali_fuera  tabaco     vesti_calz vestido    calzado   
##  [79] vivienda   alquiler   pred_cons  agua       energia    limpieza  
##  [85] cuidados   utensilios enseres    salud      atenc_ambu hospital  
##  [91] medicinas  transporte publico    foraneo    adqui_vehi mantenim  
##  [97] refaccion  combus     comunica   educa_espa educacion  esparci   
## [103] paq_turist personales cuida_pers acces_pers otros_gas  transf_gas
## [109] percep_tot retiro_inv prestamos  otras_perc ero_nm_viv ero_nm_hog
## [115] erogac_tot cuota_viv  mater_serv material   servicio   deposito  
## [121] prest_terc pago_tarje deudas     balance    otras_erog smg       
## [127] Estado     sexo      
## <0 rows> (or 0-length row.names)

leftjoin

En este ejercicio ya al existir la mism avariable en común se hace la unión para poner los nombre de cada estado a la ENIGH a partir de la clave de entidad y después lo conectamos con un select para que ordene la base , primero el Estado, la Entidad_ederativa, Abreviatura y luego toooodo lo demás .

enigh <- left_join(enigh,catalogo,by="Estado") %>% 
  select(Estado,ENTIDAD_FEDERATIVA,ABREVIATURA,everything())

Visualizar

Recuerda con la opción del chunk puedes esconder el código y dejar únicamente el resultado .ra este gráfico lo oculté y unicamente comparto el resultado, el código lo puedes encontrar en el archivo R que se subió junto con este archivo.

library(plotly)
g1 <- enigh %>% 
  filter(est_socio==1) %>% #estrato socio económico BAJO
  group_by(ENTIDAD_FEDERATIVA,sexo) %>% #agrupa Estado y sexo
  dplyr::summarise(Mediaing=mean(ingtrab)/3) %>% 
   pivot_wider(names_from = sexo,values_from = Mediaing) %>% #transpuesta del sexo"
   mutate(Diferencia=Hombre-Mujer) %>% 
   ggplot(aes(reorder(ENTIDAD_FEDERATIVA,Diferencia),Diferencia))+ #reordenar en el eje x 
   geom_col(aes(fill=Diferencia))+
   scale_fill_gradient(low = "yellow",high = "red")+
   labs(x="Estado",
        y="Brecha de Ingreso",
        title = "Brecha de ingreso por Entidad")+
  coord_flip()+scale_y_continuous(labels = scales::dollar)
## `summarise()` regrouping output by 'ENTIDAD_FEDERATIVA' (override with `.groups` argument)
ggplotly(g1)